home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 7 / BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso / Files / Hyper / Me-Mz / MenEm.cpt / Menu Emulation / card_2857.txt < prev    next >
Text File  |  1988-04-27  |  27KB  |  796 lines

  1. -- card: 2857 from stack: in
  2. -- bmap block id: 0
  3. -- flags: 4000
  4. -- background id: 2611
  5. -- name: Menu Card 1
  6. ----- HyperTalk script -----
  7. on openCard
  8.   -- The variable containing the current menu item selection is reset
  9.   -- to its initial level. The variable "blocs" contains the top and
  10.   -- bottom locations for each menu item button, one pair to a line.
  11.   -- The side coordinates are not needed because they are all the same
  12.   -- and are given by the side coordinates of the menu field
  13.   global b,blocs
  14.   put 0 into b
  15.   get rect of btn 1
  16.   put item 2 of it into blocs
  17.   put item 4 of it into item 2 of blocs
  18.   get rect of btn 2
  19.   put item 2 of it into line 2 of blocs
  20.   put item 4 of it into item 2 of line 2 of blocs
  21.   get rect of btn 3
  22.   put item 2 of it into line 3 of blocs
  23.   put item 4 of it into item 2 of line 3 of blocs
  24.   get rect of btn 4
  25.   put item 2 of it into line 4 of blocs
  26.   put item 4 of it into item 2 of line 4 of blocs
  27. end openCard
  28.  
  29. on mouseDown
  30.   -- Sets the "ok" variable to true if the initial mouseDown occurs
  31.   -- somewhere inside the simulated menubar, so the mouseStillDown
  32.   -- handler will activate the menu if the cursor is subsequently
  33.   -- dragged over the "apple" menu title.
  34.   global ok
  35.   put the mouseH into mH
  36.   put the mouseV into mV
  37.   if mH > 111 and mH < 393 and mV > 95 and mV < 114 then
  38.     put true into ok
  39.   else
  40.     put false into ok
  41.   end if
  42. end mouseDown
  43.  
  44. on mouseStillDown
  45.   -- Handles most of the actions of the menubar. Remember, once the
  46.   -- mouse button is pressed this is the only message being sent by the
  47.   -- HyperCard system, so checking the mouse position (i.e. is the
  48.   -- cursor over a given button) cannot be gotten from mouseWithin or
  49.   -- similar messages, but must be checked against the rectangle of
  50.   -- the object being watched for. This handler had to be placed above
  51.   -- the "apple" title button level so the mouseStillDown messages sent
  52.   -- from the card level if the button is first depressed within the
  53.   -- menubar but not over the actual "apple" title button would reach
  54.   -- then same mouseStillDown handler and cause the menu to activate if
  55.   -- the cursor is subsequently dragged over the "apple" title button.
  56.   global b,blocs,ok
  57.   -- First, if "ok" is true (the initial mouseDown occurred either over
  58.   -- the "apple" menu title or somewhere else inside the menubar),
  59.   -- allow the menu actions to take place.
  60.   if ok then
  61.     put the mouseV into mV  -- Get the cursor location.
  62.     put the mouseH into mH
  63.     -- Check to see if the cursor has been dragged over the "apple" menu
  64.     -- title. First, is the cursor above the bottom of the menubar?
  65.     if mV < 113 then
  66.       -- If so, is the cursor within the bounds of the "apple" menu?
  67.       if mH < 121 or mH > 149 or mV < 97 then
  68.         send mouseUp to btn 5   -- If it is over the "apple" menu, then
  69.       else                      -- send the "apple" button a mouseDown
  70.         send mouseDown to btn 5 -- (show the menu) otherwise send it a
  71.       end if                    -- mouseUp (hide the menu).
  72.       repeat with n = 1 to 4    -- Then un-hilite the menu item buttons.
  73.         set hilite of btn n to false
  74.       end repeat
  75.       exit mouseStillDown       -- And leave this message handler (no
  76.     end if                      -- other actions will be necessary).
  77.     -- If the cursor is below the menubar, is it somewhere over the
  78.     -- menu field itself, and if so, over which button (which must be
  79.     -- hilited)?
  80.     if mV ‚â• 113 and mV ‚⧠178 and mH ‚â• 121 and mH ‚⧠231 then
  81.       put b into oldB -- A place holder for the last button hilited.
  82.       -- The following loop checks to find which menu item the cursor is
  83.       -- over, and hilites the button over it so it appears to be
  84.       -- selected. The variable "b" contains the number of the currently
  85.       -- hilited button, and the search begins from the next higher ID
  86.       -- button (the next one lower on the menu) so that when the menu
  87.       -- is dragged _down_ (the most common direction to drag along a
  88.       -- menu) the first button checked is the one immediately below the
  89.       -- last button hilited, which improves the menu reaction just a
  90.       --  bit when dragging the mouse _down_ the menu. The variable
  91.       -- "blocs" contains the top and bottom coordinates for each menu
  92.       -- item button, one pair to a line.
  93.       repeat 4 times
  94.         add 1 to b
  95.         if b > 4 then put 1 into b  -- Only four buttons are in the menu
  96.         if mV ‚â• item 1 of line b of blocs and mV < item 2 of line b of blocs then
  97.           -- Once it is known which button the cursor is currently over
  98.           -- that button is hilited, and the last menu item button
  99.           -- hilited is un-hilited (if it is not the same as the new
  100.           -- button, or it would blink on and off, and it is not 0,
  101.           -- which is the reset number and not a button that can be
  102.           -- unhilited).
  103.           set hilite of btn b to true
  104.           if oldB ‚↠0 and oldB ‚↠b then set hilite of btn oldB to false
  105.           exit mouseStillDown -- Leave this handler, no more actions
  106.         end if                -- necessary.
  107.       end repeat
  108.     else
  109.       -- If the cursor is not over the menu while it is showing, then
  110.       -- un-hilite all of the buttons and reset the currently selected
  111.       -- button to 0.
  112.       repeat with n = 1 to 4
  113.         set hilite of btn n to false
  114.       end repeat
  115.       put 0 into b
  116.     end if
  117.   end if
  118. end mouseStillDown
  119.  
  120. on idle
  121.   -- For a menu selection to take place the mouse button must be
  122.   -- released over one of the hilited menu item buttons. Consequently
  123.   -- there will be no mouseUp message sent to the object that was
  124.   -- receiving the mouseStillDown messages (either the "apple" menu
  125.   -- title button, or the card itself if the button is initially
  126.   -- depressed within the menubar but not over the "apple" menu button).
  127.   -- So the only way to have the menu react after the mouse button is
  128.   -- released is to operate on the idle message which is then being
  129.   -- sent.
  130.   global b
  131.   -- First, so the computer doesn't get tied up executing many
  132.   -- HyperTalk commands while idle messages are being sent (which is
  133.   -- all the time the mouse button is not depressed), the first thing
  134.   -- this checks is whether the menu field itself is visible. If the
  135.   -- field is not visible no menu items can have been selected, so
  136.   -- the handler is quickly bypassed.
  137.   if the visible of card field 1 then
  138.     -- If variable "b" is not reset to 0 then a menu item has been
  139.     -- selected, so the normal menu actions are executed.
  140.     if b ‚↠0 then
  141.       repeat 3 times                  -- The menu item selected is
  142.         set hilite of btn b to false  -- flashed three times.
  143.         set hilite of btn b to true
  144.       end repeat
  145.       set hilite of btn b to false
  146.       hide card field 1  -- The menu field is hidden, and the "apple"
  147.       set hilite of btn 5 to false  -- menu title button is un-hilited
  148.       -- The number of the button over which the mouse button was
  149.       -- released was set up so that it corresponded to the line number
  150.       -- of the item selected in the menu field. To make the menu look
  151.       -- better, two spaces were placed before each menu item, which
  152.       -- must are removed before the doMenu command completes the menu
  153.       -- action
  154.       get line b of card field 1
  155.       delete char 1 to 2 of it
  156.       doMenu it
  157.       repeat with n = 1 to 4  -- Finally, when execution speed is no
  158.         hide btn n            -- longer a problem, the menu item buttons
  159.       end repeat              -- are hidden.
  160.     else
  161.       -- If variable "b" is 0 while the menu is showing, and the mouse
  162.       -- button is then released, it means the cursor is not somewhere
  163.       -- over the menu, so the menu and the item buttons are hidden
  164.       -- and the "apple" menu button is un-hilited.
  165.       hide card field 1
  166.       set hilite of btn 5 to false
  167.       repeat with n = 1 to 4
  168.         hide btn n
  169.       end repeat
  170.     end if
  171.   end if
  172. end idle
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195. -- part 6 (field)
  196. -- low flags: 80
  197. -- high flags: 0004
  198. -- rect: left=121 top=113 right=181 bottom=234
  199. -- title width / last selected line: 0
  200. -- icon id / first selected line: 0 / 0
  201. -- text alignment: 0
  202. -- font id: 0
  203. -- text size: 12
  204. -- style flags: 0
  205. -- line height: 16
  206. -- part name: Fake Menu Field
  207.  
  208.  
  209. -- part 1 (button)
  210. -- low flags: 80
  211. -- high flags: 0000
  212. -- rect: left=122 top=114 right=130 bottom=231
  213. -- title width / last selected line: 0
  214. -- icon id / first selected line: 0 / 0
  215. -- text alignment: 1
  216. -- font id: 0
  217. -- text size: 12
  218. -- style flags: 0
  219. -- line height: 16
  220. -- part name: New Button
  221.  
  222.  
  223. -- part 2 (button)
  224. -- low flags: 80
  225. -- high flags: 0000
  226. -- rect: left=122 top=130 right=146 bottom=231
  227. -- title width / last selected line: 0
  228. -- icon id / first selected line: 0 / 0
  229. -- text alignment: 1
  230. -- font id: 0
  231. -- text size: 12
  232. -- style flags: 0
  233. -- line height: 16
  234. -- part name: New Button
  235.  
  236.  
  237. -- part 3 (button)
  238. -- low flags: 80
  239. -- high flags: 0000
  240. -- rect: left=122 top=146 right=162 bottom=231
  241. -- title width / last selected line: 0
  242. -- icon id / first selected line: 0 / 0
  243. -- text alignment: 1
  244. -- font id: 0
  245. -- text size: 12
  246. -- style flags: 0
  247. -- line height: 16
  248. -- part name: New Button
  249.  
  250.  
  251. -- part 4 (button)
  252. -- low flags: 80
  253. -- high flags: 0000
  254. -- rect: left=122 top=162 right=178 bottom=231
  255. -- title width / last selected line: 0
  256. -- icon id / first selected line: 0 / 0
  257. -- text alignment: 1
  258. -- font id: 0
  259. -- text size: 12
  260. -- style flags: 0
  261. -- line height: 16
  262. -- part name: 
  263.  
  264.  
  265. -- part 5 (button)
  266. -- low flags: 00
  267. -- high flags: 8000
  268. -- rect: left=121 top=97 right=113 bottom=149
  269. -- title width / last selected line: 0
  270. -- icon id / first selected line: 0 / 0
  271. -- text alignment: 1
  272. -- font id: 0
  273. -- text size: 12
  274. -- style flags: 0
  275. -- line height: 16
  276. -- part name: 
  277. ----- HyperTalk script -----
  278. on mouseUp                   -- The menu field is hidden, the "apple"
  279.   global b                   -- menu title is un-hilited, the buttons
  280.   hide card field 1          -- that sit over the menu items are hidden,
  281.   set hilite of me to false  -- and the variable containing the current
  282.   repeat with n = 1 to 4     -- menu item selection (b) is reset.
  283.     hide btn n
  284.   end repeat
  285.   put 0 into b
  286. end mouseUp
  287.  
  288. on mouseDown               -- The "apple" menu title is hilited, the
  289.   global b,ok              -- menu field is shown, the buttons that sit
  290.   set hilite of me to true -- over the menu items are shown, the
  291.   show card field 1        -- variable containing the current menu item
  292.   repeat with n = 1 to 4   -- selection (b) is reset, and the variable
  293.     show button id n       -- (ok) that tells the mouseStillDown handler
  294.   end repeat               -- whether or not to allow a drag over the
  295.   put 0 into b             -- menu title to activate the menu is set.
  296.   put true into ok
  297. end mouseDown
  298.  
  299.  
  300. -- The mouseStillDown handler is placed at the card level, because there
  301. -- is another mouseDown handler at the card level (that sets the "ok"
  302. -- variable to true if the initial mouseDown is inside the menubar but
  303. -- not over the "apple" menu title) which uses the same mouseStillDown
  304. -- handler. The mouseStillDown handler does most of the tasks that make
  305. -- the menubar function.
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321. -- part 8 (button)
  322. -- low flags: 00
  323. -- high flags: 2000
  324. -- rect: left=362 top=215 right=235 bottom=383
  325. -- title width / last selected line: 0
  326. -- icon id / first selected line: 19678 / 19678
  327. -- text alignment: 1
  328. -- font id: 0
  329. -- text size: 12
  330. -- style flags: 0
  331. -- line height: 16
  332. -- part name: About This Stack
  333. ----- HyperTalk script -----
  334. on mouseUp
  335.   set scroll of card field 2 to 0
  336.   hide btn 7
  337.   hide btn id 14
  338.   hide btn id 18
  339.   hide btn id 20
  340.   show card field 2
  341. end mouseUp
  342.  
  343.  
  344.  
  345. -- part 9 (field)
  346. -- low flags: 81
  347. -- high flags: 0007
  348. -- rect: left=12 top=56 right=299 bottom=497
  349. -- title width / last selected line: 0
  350. -- icon id / first selected line: 0 / 0
  351. -- text alignment: 0
  352. -- font id: 4
  353. -- text size: 9
  354. -- style flags: 0
  355. -- line height: 12
  356. -- part name: About field
  357. ----- HyperTalk script -----
  358. on mouseUp
  359.   hide card field 2
  360.   show btn 7
  361.   show btn id 14
  362.   show btn id 18
  363.   show btn id 20
  364. end mouseUp
  365.  
  366.  
  367.  
  368. -- part 10 (field)
  369. -- low flags: 80
  370. -- high flags: 0007
  371. -- rect: left=21 top=33 right=285 bottom=491
  372. -- title width / last selected line: 0
  373. -- icon id / first selected line: 0 / 0
  374. -- text alignment: 0
  375. -- font id: 4
  376. -- text size: 9
  377. -- style flags: 0
  378. -- line height: 12
  379. -- part name: Temp Script Holder
  380.  
  381.  
  382. -- part 11 (button)
  383. -- low flags: 00
  384. -- high flags: A003
  385. -- rect: left=185 top=272 right=294 bottom=316
  386. -- title width / last selected line: 0
  387. -- icon id / first selected line: 0 / 0
  388. -- text alignment: 1
  389. -- font id: 0
  390. -- text size: 12
  391. -- style flags: 0
  392. -- line height: 16
  393. -- part name: Show Menu Parts
  394. ----- HyperTalk script -----
  395. on mouseUp
  396.   if card field 3 is empty then
  397.     put the script of this card into card field 3
  398.     put the script of btn id 5 into card field 4
  399.     set script of this card to empty
  400.     set script of btn id 5 to empty
  401.     show card field 1
  402.     repeat with n = 1 to 4
  403.       show btn n
  404.     end repeat
  405.     set name of me to "Hide Menu Parts"
  406.     show card field 5
  407.     set userLevel to 5
  408.     choose button tool
  409.     show tool window
  410.     set loc of tool window to 18,111
  411.   else
  412.     set the script of this card to card field 3
  413.     set the script of btn id 5 to card field 4
  414.     put empty into card field 3
  415.     put empty into card field 4
  416.     hide card field 5
  417.     repeat with n = 1 to 4
  418.       hide btn n
  419.     end repeat
  420.     hide card field 1
  421.     set name of me to "Show Menu Parts"
  422.     if the hilite of btn "do browsing" then set userLevel to 1
  423.   end if
  424. end mouseUp
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445. -- part 12 (field)
  446. -- low flags: 80
  447. -- high flags: 0007
  448. -- rect: left=30 top=60 right=159 bottom=474
  449. -- title width / last selected line: 0
  450. -- icon id / first selected line: 0 / 0
  451. -- text alignment: 0
  452. -- font id: 4
  453. -- text size: 9
  454. -- style flags: 0
  455. -- line height: 12
  456. -- part name: Temp Script Holder
  457.  
  458.  
  459. -- part 13 (field)
  460. -- low flags: 81
  461. -- high flags: 2002
  462. -- rect: left=151 top=33 right=75 bottom=345
  463. -- title width / last selected line: 0
  464. -- icon id / first selected line: 0 / 0
  465. -- text alignment: 1
  466. -- font id: 0
  467. -- text size: 12
  468. -- style flags: 0
  469. -- line height: 16
  470. -- part name: Warning (danger, Will Robinson!)
  471.  
  472.  
  473. -- part 14 (button)
  474. -- low flags: 00
  475. -- high flags: A003
  476. -- rect: left=160 top=305 right=327 bottom=346
  477. -- title width / last selected line: 0
  478. -- icon id / first selected line: 0 / 0
  479. -- text alignment: 1
  480. -- font id: 0
  481. -- text size: 12
  482. -- style flags: 0
  483. -- line height: 16
  484. -- part name: Remove Script Comments
  485. ----- HyperTalk script -----
  486. on mouseUp
  487.   hide msg
  488.   if the optionKey is down then
  489.     if the short name of me is "remove script comments" then
  490.       answer "This will reset scripts for comment removal." with "OK" or "Cancel"
  491.       if it is not "cancel" then
  492.         put empty into card field id 15
  493.         put empty into card field id 16
  494.         put empty into card field id 17
  495.       end if
  496.     end if
  497.   else
  498.     put false into done
  499.     if the short name of me is "remove script comments" then
  500.       if card field id 15 is empty and card field id 16 is empty and card field id 17 is empty then
  501.         answer "Comments may be restored later" with "Cancel" or "OK"
  502.         if it is "Cancel" then
  503.           exit mouseUp
  504.         else
  505.           set loc of msg to 17,140
  506.           set cursor to 4
  507.           repeat with x = 1 to 3
  508.             if x = 1 then
  509.               put the script of this stack into scriptHolder
  510.               put "the stack script" into theName
  511.             end if
  512.             if x = 2 then
  513.               put the script of this card into scriptHolder
  514.               put "the card script" into theName
  515.             end if
  516.             if x = 3 then
  517.               put the script of btn id 5 into scriptHolder
  518.               put "the" && quote & "apple" & quote && "button script" into theName
  519.             end if
  520.             put the number of lines in scriptHolder into theLines
  521.             put 1 into n
  522.             repeat until n = theLines
  523.               put "Removing comments from line" && n && "out of" && theLines && "of" && theName
  524.               put the number of chars in line n of scriptHolder into theChars
  525.               put offset("-",line n of scriptHolder) into start
  526.               if start ‚↠0 then
  527.                 put false into exiit
  528.                 repeat until exiit
  529.                   if char start-1 of line n of scriptHolder is " " then
  530.                     subtract one from start
  531.                   else
  532.                     put true into exiit
  533.                   end if
  534.                 end repeat
  535.                 delete char start to theChars of line n of scriptHolder
  536.                 repeat until exiit
  537.                   if first char of line n of scriptHolder is " " then
  538.                     delete first char of line n of scriptHolder
  539.                   else
  540.                     put true into exiit
  541.                   end if
  542.                 end repeat
  543.               end if
  544.               if line n of scriptHolder is empty then
  545.                 delete line n of scriptHolder
  546.               else
  547.                 add 1 to n
  548.               end if
  549.               put the number of lines in scriptHolder into theLines
  550.             end repeat
  551.             if x = 1 then put scriptHolder into stackHolder
  552.             if x = 2 then put scriptHolder into cardHolder
  553.             if x = 3 then put scriptHolder into btnHolder
  554.           end repeat
  555.           put "                                              Finished!"
  556.           wait 1 seconds
  557.           hide msg
  558.           put true into done
  559.         end if
  560.       end if
  561.       set the name of me to "Restore Script Comments"
  562.       hide btn id 19
  563.     else
  564.       set the name of me to "Remove Script Comments"
  565.       show btn id 19
  566.     end if
  567.     set cursor to 4
  568.     if not done then
  569.       put card field id 15 into stackHolder
  570.       put card field id 16 into cardHolder
  571.       put card field id 17 into btnHolder
  572.     end if
  573.     put the script of this stack into card field id 15
  574.     put the script of this card into card field id 16
  575.     put the script of btn id 5 into card field id 17
  576.     set the script of this stack to stackHolder
  577.     set the script of this card to cardHolder
  578.     set the script of btn id 5 to btnHolder
  579.   end if
  580. end mouseUp
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595. -- part 15 (field)
  596. -- low flags: 80
  597. -- high flags: 0002
  598. -- rect: left=152 top=46 right=58 bottom=164
  599. -- title width / last selected line: 0
  600. -- icon id / first selected line: 0 / 0
  601. -- text alignment: 0
  602. -- font id: 4
  603. -- text size: 9
  604. -- style flags: 0
  605. -- line height: 12
  606. -- part name: Stack Script
  607.  
  608.  
  609. -- part 16 (field)
  610. -- low flags: 80
  611. -- high flags: 0002
  612. -- rect: left=247 top=46 right=58 bottom=259
  613. -- title width / last selected line: 0
  614. -- icon id / first selected line: 0 / 0
  615. -- text alignment: 0
  616. -- font id: 4
  617. -- text size: 9
  618. -- style flags: 0
  619. -- line height: 12
  620. -- part name: Card Script
  621.  
  622.  
  623. -- part 17 (field)
  624. -- low flags: 80
  625. -- high flags: 0002
  626. -- rect: left=346 top=45 right=57 bottom=358
  627. -- title width / last selected line: 0
  628. -- icon id / first selected line: 0 / 0
  629. -- text alignment: 0
  630. -- font id: 4
  631. -- text size: 9
  632. -- style flags: 0
  633. -- line height: 12
  634. -- part name: Button Script
  635.  
  636.  
  637. -- part 18 (button)
  638. -- low flags: 00
  639. -- high flags: C006
  640. -- rect: left=397 top=277 right=299 bottom=502
  641. -- title width / last selected line: 0
  642. -- icon id / first selected line: 0 / 0
  643. -- text alignment: 1
  644. -- font id: 0
  645. -- text size: 12
  646. -- style flags: 0
  647. -- line height: 16
  648. -- part name: Do Scripting
  649. ----- HyperTalk script -----
  650. on mouseUp
  651.   set hilite of me to true
  652.   set hilite of btn "do browsing" to false
  653.   set userLevel to 5
  654. end mouseUp
  655.  
  656.  
  657.  
  658. -- part 20 (button)
  659. -- low flags: 00
  660. -- high flags: 8006
  661. -- rect: left=397 top=308 right=330 bottom=502
  662. -- title width / last selected line: 0
  663. -- icon id / first selected line: 0 / 0
  664. -- text alignment: 1
  665. -- font id: 0
  666. -- text size: 12
  667. -- style flags: 0
  668. -- line height: 16
  669. -- part name: Do Browsing
  670. ----- HyperTalk script -----
  671. on mouseUp
  672.   set hilite of me to true
  673.   set hilite of btn "do scripting" to false
  674.   set userLevel to 1
  675. end mouseUp
  676.  
  677.  
  678.  
  679. -- part contents for card part 6
  680. ----- text -----
  681.   Alarm Clock
  682.   Control Panel
  683.   Key Caps
  684.   Scrapbook
  685.  
  686. -- part contents for card part 9
  687. ----- text -----
  688.  
  689.               *********************************************
  690.               *                                           *
  691.               *             Menu Emulation                *
  692.               *       by William G. Anderson, Jr.         *
  693.               *              April  1988                  *
  694.               *                                           *
  695.               *           CIS id  76254,356               *
  696.               *                                           *
  697.               *********************************************
  698.  
  699.  
  700. This stack is an exercise to simulate the actions of the menubar using nothing but HyperTalk.  Granted the objects involved do not react as quickly as those of a real menubar, but if you pass over the menu items slowly enough they will do a passable imitation of a real menubar. This was written on a Mac+ with a Radius accelerator board, so on non-accelerated Macs it may be very slow (I have no way to know). A hard disk also speeds things up considerably.
  701.  
  702. Special notes: 1. The scripts of this stack, which are located at the stack
  703.                   level, the card level, and in the "apple" button (which 
  704.                   is the title of the simulated menubar), are all heavily 
  705.                   commented for your convenience. I can't be sure, but this 
  706.                   does seem to slow the action of the simulated menu slighty.
  707.                   It also obscures the structure of the scripts. Therefore,
  708.                   I have included a button to strip the comments from the 
  709.                   scripts of this stack. The actual removal of comments only
  710.                   happens the first time the button is used, at which time
  711.                   both the commented and uncommented versions of the scripts
  712.                   are stored. Future use of the button merely places the 
  713.                   stored version into the script, and the script version   
  714.                   goes into storage. So you can quickly toggle between the 
  715.                   two versions as needed. (If you wish to remove the 
  716.                   comments again and watch the numbers sail by, hold down 
  717.                   the option key while clicking on the "remove script 
  718.                   comments" button. This will reset the scripts and fields 
  719.                   so the next mouse up will remove the comments again, while
  720.                   considerably shrinking the size of this stack.)
  721.                2. The locations and numbers of the buttons and field used by 
  722.                   the scripts are fixed whithin the scripts themselves. If 
  723.                   you move, remove, or change the size of any of these 
  724.                   objects the simulation will fail unless you change the 
  725.                   scripts to accomodate the changes you make.
  726.                3. There is an idle message handler that removes the menu 
  727.                   field and its buttons from the screen when they are 
  728.                   visible. Also, the "apple" menu button itself will 
  729.                   similarly hide the menu field and buttons. To make it 
  730.                   possible for you to examine the menu and its buttons, the 
  731.                   "Show Menu Parts" button temporarily stores the "apple" 
  732.                   menu button script and card level scripts in hidden fields,
  733.                   sets the user level to "scripting," shows the tool window 
  734.                   and chooses the button tool (to show the menu item buttons
  735.                   over the menu field). When you are finished examining the 
  736.                   menu field and its buttons, clicking on the "Hide Menu 
  737.                   Parts" button will restore the card and button scripts, 
  738.                   resetting the menu emulation.
  739.  
  740. Actions performed by the simulated menu:
  741.  
  742. (Any mention below of terms such as "menu" or "menubar" refer to the simulated menubar in the center of the screen, not the real one. Also, all references to "dragging" the mouse mean a continuous mouse down from the time the mouse was first clicked over some area that would normally actuate the menu.)
  743.  
  744. 1. A mouseDown on the "apple" menu title causes the menu title to hilite,
  745.    and the menu to show.
  746.  
  747. 2. Dragging the mouse over the items of the menu causes them to hilite when
  748.    the mouse is over them, and un-hilite when the mouse is no longer over 
  749.    them.
  750.  
  751. 3. Dragging the mouse completely off the menu itself (to either side or the
  752.    bottom) causes all menu items to be un-selected.
  753.  
  754. 4. Dragging the mouse back over the menu while still below the menubar 
  755.    causes the menu item first dragged over to hilite.
  756.  
  757. 5. Releasing the mouse button while over a hilited menu item causes the menu
  758.    item to blink on and off three times, the menu disappears from the screen,
  759.    the menu title un-hilites, and the selected action occurs.
  760.  
  761. 6. Releasing the mouse button while the menu is showing but no menu items 
  762.    are hilited (i.e. the mouse is below the menubar but is to one side of or
  763.    below the menu) causes the menu to disappear and the menu title to un-
  764.    hilite.
  765.  
  766. 7. If the cursor is no longer over the menu title when the cursor is dragged 
  767.    above the bottom of the menubar the menu disappears and the menu title
  768.    will un-hilite.
  769.  
  770. 8. After the occurance of item 7 above, dragging the mouse over the menu
  771.    title causes the menu title to hilite and the menu will reappear.
  772.  
  773. 9. If the mouseDown initially occurs somewhere inside the menubar, but not
  774.    over the menu title itself, dragging the cursor over the menu title will
  775.    cause the menu title to hilite and the menu will appear.
  776.  
  777. 10. Dragging the cursor _down_ the menu will cause the menu items passed
  778.     over to hilite and un-hilite faster than when dragging _up_ the menu. It
  779.     was simple to optimize the script for one direction or the other, and
  780.     since menus are initially scanned down I selected that direction to have
  781.     the better reaction time.
  782.  
  783.  
  784. Note: While writing this I found that having any graphics in the card layer
  785.       substantially slowed the speed at which the HyperTalk scripts used in
  786.       this stack ran. Perhaps it is not a good idea to put graphics in the 
  787.       card layer at all, if it can be avoided.
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794. -- part contents for card part 13
  795. ----- text -----
  796. Click on button "Hide Menu Parts" to re-enable menu